package com.tool_stdy.thread;

import java.util.concurrent.*;

/**
 * Created by yan_li on 2016/1/27.
 */
public class TestFuture {

    /**
     * 处理子任务线程类。
     * 由于需要返回值所以事先Callable
     * 不需要返回值可以实现Runnable接口
     */
    static class DoOtherThings implements Callable<Integer>{
        private int i;
        public void setI(int i){
            this.i=i;
        }
        public synchronized int add(){
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return i++;

        }
        @Override
        public Integer call() throws Exception {
            return add();
        }
    }

    public static String getsName(String name){
        return name;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException{
        System.out.println("主线程接受客户端请求...");
        System.out.println("进行主任务执行,于此同时需要处理子任务,子任务耗时");

        /**
         * 由于处理某一个子任务需要的时间比较长,采用Future模式,新开辟一个线程单独进行该项任务的处理
         * 此时主线程是去执行主线程任务
         */
        ExecutorService exec = Executors.newFixedThreadPool(1);
        DoOtherThings dt = new DoOtherThings();
        dt.setI(10);
        Future<Integer> getValue = exec.submit(dt);
        //用来判断子线程是否处理完任务
//        if(getValue.isDone()){
//            System.out.println("Done");
//        }
        System.out.println(getsName("做其他事情..Hello Word"));
        int value = 0;
        try {
            //进入阻塞等待状态，超过5S会超时不进行等待
            value = getValue.get(5, TimeUnit.SECONDS);
        } catch (TimeoutException e) {
            System.out.println("等待时间太长了,不等了返回！");
        }
        System.out.println(value);
        exec.shutdown();
    }
}
